SSD加速HDD盘方案之bcache | 您所在的位置:网站首页 › Linux下SSD缓存加速之bcache使用 › SSD加速HDD盘方案之bcache |
简介
bcache Bcache是Linux内核块设备层cache, 支持将一个或多个速度较快的磁盘设备(如SSD)作为读写速度相对较慢的磁盘设备的cache. Bcache从Linux-3.10开始正式并入内核主线 Bcache具有以下特征: 一个缓存设备可以作为多个设备的缓存,并且可以在设备运行时动态添加和删除缓存 可以从非正常状态关机中恢复,只有当缓存写入到后端设备才会确认写完成 正确处理写阻塞和刷缓存 支持writethrough、writeback和writearound等写缓存模式 检测并避开顺序IO(可配置阈值,或关闭该选项) 当检测到SSD延迟超过配置边界值,减少到SSD流量(当一个SSD作为多个磁盘缓存时使用) 缓存不命中时预读(默认关闭) 高性能的writeback实现:脏数据通过排序后再刷到磁盘中。如果设置了writeback_percent值,后台的writeback进程利用PD控制器根据脏数据比例平滑地处理脏数据 使用高效率的B+树,硬件设备足够快速的情况下,bcache随机读可以达到1M IOPS 可在生产中稳定的使用 相关名词 cache device: (前端)缓存盘, 一般为SSD高速磁盘设备 backing device: 后端(数据)盘, 一般为HDD低速磁盘设备 缓存策略 writethrough (直写策略): 数据写入时, 必须SSD和HDD盘都写入成功, 写入请求才算完成, 写入请求才返回. 因此对于写入, 该策略并未有性能提升. 适用于读多写少的场景, 可以保证数据的强一致性 writeback (回写策略): 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景 writearound (绕写 策略): 数据写入时, 绕过SSD, 直接写入到HDD盘中. 可以防止SSD因写I/O而填满, 导致以后不可重新读取. 缺点是: 当数据第一次读取, 由于写入时绕过了SSD, 因此会有SSD从HDD加载数据的操作 none: 读写操作都不会涉及到缓存盘, 将直接与后端磁盘交互, 相当于SSD是个摆设? 部署流程 1. 部署环境 1.1 系统环境 系统版本 内核版本 CentOS Linux release 7.7.1908 (Core) 3.10.0-1062.el7.x86_64 (需升级) 1.2 硬盘拓扑由于是虚拟机环境, 所以用30G的HDD盘来模拟SSD盘 系统盘 前端缓存盘 后端数据盘 20G (sda) 30G (sdb) 100G (sdc) 2. 安装前准备 2.1 更新内核版本在Centos7系列的内核中, 默认不支持bcache(未启用, 需要修改选项重新编译内核), 因此需要升级内核版本 个人感觉修改选项来重新编译内核比较繁琐, 而且编译后的内核还是之前的版本, 即3.10.x 该版本的内核对目前主流的应用支持的不是很好(有bug), 毕竟很老了, 可以升级内核的话最好升级内核 升级了内核版本能够体验很多新的功能特性, 如最近很火的eBPF 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # 1. 载入公钥 [root@localhost opt]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 2. 安装ELRepo [root@localhost opt]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 3. 载入elrepo-kernel元数据 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel repolist # 4. 安装最新的长期维护版本 (当前为: 5.4.146-1) [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64 # 5. 配置grub2启动顺序 # 5.1 查看当前grub2启动顺序 [root@localhost opt]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (5.4.146-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-37da956671864c2d93da8d9bf2a76257) 7 (Core) # 5.2 配置grub2启动顺序, 默认启动的顺序是从0开始,根据上面实际展示的进行选择 [root@localhost opt]# grub2-set-default 0 # 6. 重启系统, 确认内核版本 [root@localhost opt]# reboot [root@localhost opt]# uname -a Linux localhost.localdomain 5.4.146-1.el7.elrepo.x86_64 #1 SMP Tue Sep 14 08:38:01 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux # 7. 删除老内核以及内核工具包 [root@localhost opt]# rpm -qa|grep kernel|grep 3.10|xargs yum remove -y # 8. 安装新版本工具包 [root@localhost opt]# yum install perl -y [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-devel.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-headers.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools-libs.x86_64 # 9. 确认已安装的内核工具包 [root@localhost ~]# rpm -qa | grep kernel kernel-lt-tools-libs-5.4.146-1.el7.elrepo.x86_64 kernel-lt-devel-5.4.146-1.el7.elrepo.x86_64 kernel-lt-5.4.146-1.el7.elrepo.x86_64 kernel-lt-tools-5.4.146-1.el7.elrepo.x86_64 kernel-lt-headers-5.4.146-1.el7.elrepo.x86_64 3. 部署bcache 3.1 加载内核模块bcache已被合并进了linux内核中, 因此只需要确保对应的内核模块已加载即可 1 2 3 4 5 6 7 8 [root@localhost ~]# lsmod | grep bcache # 加载内核模块 [root@localhost ~]# modprobe bcache [root@localhost ~]# lsmod | grep bcache bcache 245760 0 crc64 16384 1 bcache 3.2 编译安装bcace-tools 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # 安装依赖包 [root@localhost ~]# yum install libblkid-devel -y # 安装gcc [root@localhost ~]# yum install gcc -y # 安装git [root@localhost ~]# yum install git -y [root@localhost ~]# cd /opt # 下载bcace-tools源码 [root@localhost opt]# git clone https://gitee.com/yinianzhiyue/bcache-tools.git [root@localhost opt]# cd bcache-tools/ # 编译安装 [root@localhost bcache-tools]# make && make install # 验证bcache-tools是否安装成功 [root@localhost opt]# make-bcache Please supply a device Usage: make-bcache [options] device -C, --cache Format a cache device -B, --bdev Format a backing device -b, --bucket bucket size -w, --block block size (hard sector size of SSD, often 2k) -o, --data-offset data offset in sectors --cset-uuid UUID for the cache set --writeback enable writeback --discard enable discards --cache_replacement_policy=(lru|fifo) -h, --help display this help and exit 3.3 配置bcache 3.3.1 查看当前磁盘设备 1 2 3 4 5 6 7 8 9 10 11 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sdb为模拟的SSD前端缓存盘 sdb 8:16 0 30G 0 disk # sdc为后端数据盘 sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.3.2 手工创建bcache设备如对手工操作比较熟悉了, 可以跳过手工的步骤. 可直接参考步骤3.3.3来一键创建bcache设备 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 # make-bcache # -C 用来指定高速缓存盘, 即SSD盘 # -B 用来指定慢速数据盘, 即HDD盘 # 1. 创建backing device [root@localhost opt]# make-bcache -B /dev/sdc UUID: 12117060-d332-4736-9c11-1dd668f01c16 Set UUID: e0f5b95d-1f37-413c-b7ba-5bb774fc7b07 version: 1 block_size: 1 data_offset: 16 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk # 此时sdc下多了一个bcach0 sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 2. 创建cache device [root@localhost opt]# make-bcache -C /dev/sdb UUID: 08e78fb6-f6dd-4646-8376-a83d8f115f3c Set UUID: bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 # 创建device时, 可以通过--block参数来指定后端设备的扇区大小, --bucket参数来指定前端设备的erase block size --block, 指定后端设备的扇区大小, 默认512B --bucket, 指定前端设备的erase block size, 应与超速缓存设备的擦除块大小匹配, 以便减少写入放大现象 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 因为目前尚未关联bcache设备, 因此sdb下目前还看不到任何的bcache设备 sdb 8:16 0 30G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 3. 将cache device绑定至bcacheX设备(建立关联关系), 这样高速设备才能为低速设备提供缓存作用 # 慢速设备/dev/sdc -> 通过创建后端设备 -> 创建了/dev/bcache0设备 # 高速设备/dev/sdb -> 通过创建前端设备 -> 相当于登记了高速设备的信息? # 前端设备 -> 建立关联关系 -> /dev/bcache0, 这样就实现了高速设备为低速设备提供缓存的功能 # 查看前端设备的cset.uuid信息 [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum 6B0C38BBADF032B2 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 08e78fb6-f6dd-4646-8376-a83d8f115f3c dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 # 前端设备与bcache0建立关联关系 [root@localhost opt]# echo "bf560b4a-2217-43d5-9ccb-aaccfba6c1b8" > /sys/block/bcache0/bcache/attach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 建立关联关系后, 此时sdb下就可以看到bcache设备了 sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 此时一个基本的bacache就已经配置好了 3.3.3 一键创建bcache设备在熟悉了手工创建的流程后, 后期操作就可以通过命令来一键创建了 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # make-bcache # -C 用来指定高速缓存盘, 即SSD盘 # -B 用来指定低速数据盘, 即HDD盘 # 创建device时, 可以通过--block参数来指定后端设备的扇区大小, --bucket参数来指定前端设备的erase block size --block, 指定后端设备的扇区大小, 默认512B --bucket, 指定前端设备的erase block size, 应与超速缓存设备的擦除块大小匹配, 以便减少写入放大现象 # 例如, 如果使用具有4k扇区的硬盘和具有2MB擦除块大小的SSD # [root@localhost opt]# make-bcache --block 4k --bucket 2M -C /dev/sdc # 一块高速缓存盘可以为多块低速盘加速, 因此如果有多块盘时, -B可以连续给多个 # 如: make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd /dev/sde # 这里演示只有一块低速盘 [root@localhost opt]# make-bcache -C /dev/sdb -B /dev/sdc UUID: 3e338886-3ca9-424e-a674-e82017ca1f1a Set UUID: 2833dcdc-685a-49d2-9908-33ae234402ca version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 UUID: f6316e33-47ef-4b34-8337-bc3b22df9f32 Set UUID: 2833dcdc-685a-49d2-9908-33ae234402ca version: 1 block_size: 1 data_offset: 16 # 再次查看当前磁盘设备 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 最终实现的效果与步骤3.3.2一致 3.4 使用bcache直接把/dev/bcache0当做磁盘格式化分区挂载使用即可 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 # 格式化文件系统 [root@localhost opt]# mkfs.xfs /dev/bcache0 meta-data=/dev/bcache0 isize=512 agcount=4, agsize=6553600 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=26214398, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=12799, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # 创建待挂载目录 [root@localhost opt]# mkdir /mydata # 挂载磁盘 [root@localhost opt]# mount /dev/bcache0 /mydata/ [root@localhost opt]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 976M 0 976M 0% /dev tmpfs 989M 0 989M 0% /dev/shm tmpfs 989M 8.7M 980M 1% /run tmpfs 989M 0 989M 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 1.8G 16G 11% / /dev/sda1 1014M 139M 876M 14% /boot tmpfs 198M 0 198M 0% /run/user/0 # 已挂载成功 /dev/bcache0 100G 33M 100G 1% /mydata # 此时往挂载点/mydata中读写数据, 就能被ssd缓存了 [root@localhost opt]# dd if=/dev/zero of=/mydata/test_file bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 0.329173 s, 319 MB/s [root@localhost opt]# ls -alh /mydata total 100M drwxr-xr-x. 2 root root 23 Sep 17 04:09 . dr-xr-xr-x. 19 root root 253 Sep 16 22:32 .. -rw-r--r--. 1 root root 100M Sep 17 04:09 test_file 3.5 bcache相关操作 3.5.1 查看当前bcache状态 no cache: 该backing device没有attach任何caching device clean: 一切正常,缓存是干净的 dirty: 一切正常,已启用回写,缓存是脏的 inconsistent: 遇到问题,后台设备与缓存设备不同步 1 2 [root@localhost opt]# cat /sys/block/bcache0/bcache/state clean 3.5.2 查看当前缓存数据量及调整回写阈值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@localhost opt]# cat /sys/block/bcache0/bcache/dirty_data 0.0k # 当缓存策略为writeback时, 运行一段时间后会有一定的缓存数据量 [root@localhost opt]# cat /sys/block/bcache0/bcache/dirty_data 24.7G # 有几个参数来控制缓存的回写时机, 参数均在: /sys/block/bcache0/bcache/ 目录下 - writeback_percent: 如果非零, bcache会尝试保持这个百分比的缓存脏数据, 限制后台回写并使用PD控制器平滑调整比率, 默认10 (脏数据量占SSD磁盘空间的百分之十时才开始回写, 否则一直在SSD中?) - writeback_delay: 当脏数据写入缓存并且之前没有包含任何数据时, 在启动写回之前等待一些秒数. 默认为30 - writeback_rate: 每秒扇区速率, 如果writeback_percent非零, 则回写被限制到这个速率. 由bcache不断调整, 但可能也可以由用户设置 - writeback_running: 如果关闭, 则不会发生脏数据的回写, 脏数据仍将被添加到缓存中, 直到其将要满时. 仅用于基准测试. 默认开启 # 将writeback_percent调整至0, 也就意味着会将所有的dirty data都刷到backing device中 [root@localhost opt]# echo 0 > /sys/block/bcache0/bcache/writeback_percent 3.5.3 查看及调整缓存策略 1 2 3 4 5 6 7 8 9 10 # 查看当前默认策略 [root@localhost opt]# cat /sys/block/bcache0/bcache/cache_mode [writethrough] writeback writearound none # 修改缓存策略为: writeback [root@localhost opt]# echo writeback > /sys/block/bcache0/bcache/cache_mode # 再次查看 [root@localhost opt]# cat /sys/block/bcache0/bcache/cache_mode writethrough [writeback] writearound none 3.5.4 新增低速盘并关联高速缓存盘bcache支持一块前端高速SSD盘加速多块后端低速盘, 因此如果需要添加新的低速盘, 请参考如下操作 当数据盘容量不足需要扩容时, 可参考下图, 在bcache上增再套一层lvm, 通过lvm可以很方便的实现后期扩容 lvm-bcache 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 新增了一块70G的盘作为新增的低速盘 sdd 8:48 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 创建新的后端设备 [root@localhost opt]# make-bcache -B /dev/sdd UUID: 6b42714b-5303-47f2-8c0d-b5b259986ebf Set UUID: 0003aa98-3cfd-4167-b1d0-5e7b06b63e63 version: 1 block_size: 1 data_offset: 16 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 此时sdd下多了一个bcache1 # 注意: 新增的后端设备并不会与之前的相同, 而是会创建一个新的bcaheX # 也就是说, 如果之前的盘容量不够用, 想增加新盘来扩容, 默认是不行的? # 可以在上层再套一层lvm, 后期需要扩容的话通过lvm来实现, 感觉可行, 在网上也看到了类似的架构图, 见上图 sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 与之前的前端缓存盘建立关联关系 # 查看前端设备的cset.uuid信息 [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum 6B0C38BBADF032B2 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 08e78fb6-f6dd-4646-8376-a83d8f115f3c dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 [root@localhost opt]# echo "bf560b4a-2217-43d5-9ccb-aaccfba6c1b8" > /sys/block/bcache1/bcache/attach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # 建立关联关系后, 高速缓存盘sdb下就会增加新的bcache设备了 sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk /mydata └─bcache1 252:128 0 70G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.5 删除后端低速盘每一块低速盘(HDD)在经过make-bcache后, 都会对应一个bcacheX设备, 删除低速盘就是将对应的bcacheX设备停掉(删掉). 如果该bcacheX设备有绑定前端盘(SSD), 需要先解除与前端盘的关联 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk └─bcache2 252:256 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 当前环境bcache情况如下: - /dec/sdb: 前端盘(SSD), 并且绑定了bcache0和bcache1 - /dev/sdc: 后端盘(HDD), 对应的bcache设备为bcache0 - /dev/sdd: 后端盘(HDD), 对应的bcache设备为bcache1 - /dev/sde: 后端盘(HDD), 对应的bcache设备为bcache2 - /dev/sdf: 后端盘(HDD), 对应的bcache设备为bcache3下面演示了如何删除所有的后端盘, 包括: 绑定了前端缓存盘和未绑定前端缓存盘的情况 3.5.5.1 删除未绑定前端缓存盘的后端盘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk └─bcache2 252:256 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 未绑定前端缓存盘的后端盘列表如下: - /dev/sde - /dev/sdf # 删除后端盘sde # 在lsblk中可以看到, sde对应的bcache设备为bcache2 # 停掉对应的bcache设备即可 [root@localhost opt]# echo 1 > /sys/block/bcache2/bcache/stop # 再次查看 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk # 此时sde对应的bcache设备已经没有了 sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 后端盘sdf同理 # sdf对应bcache3 [root@localhost opt]# echo 1 > /sys/block/bcache3/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sdf对应的bcache设备也没了 sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.5.2 删除绑定了前端缓存盘的后端盘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 # 对于绑定了前端缓存盘的后端盘, 在删除前需要先移除绑定的前端盘, 然后再对后端盘进行删除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 绑有前端缓存盘的后端盘列表如下: - /dev/sdc - /dev/sdd # 删除后端盘sdc # sdc对应的bcache设备为bcache0, bcache0上绑定了前端盘sdb # 移除bcache0前端盘的绑定 # 1. 获取前端盘sdb的cset.uuid [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum BFF5D72B4A323990 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 3e338886-3ca9-424e-a674-e82017ca1f1a dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid 2833dcdc-685a-49d2-9908-33ae234402ca # 2. 通过获取到的cset.uuid移除bcache0的绑定 [root@localhost opt]# echo "2833dcdc-685a-49d2-9908-33ae234402ca" > /sys/block/bcache0/bcache/detach # 验证是否移除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # 此时sdb下的bcache0已经没有了 sdb 8:16 0 30G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 删除后端盘sdc [root@localhost opt]# echo 1 > /sys/block/bcache0/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk # 此时sdc的bcache0设备已经没了 sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 同理, 删除后端盘sdd # sdd对应的bcache设备为bcache1 # 移除bcache1前端盘的绑定 [root@localhost opt]# echo "2833dcdc-685a-49d2-9908-33ae234402ca" > /sys/block/bcache1/bcache/detach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # sdb下已经没了 sdb 8:16 0 30G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 删除后端盘sdd [root@localhost opt]# echo 1 > /sys/block/bcache1/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk sdb 8:16 0 30G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.6 删除前端高速缓存盘 1 2 3 4 5 6 7 8 9 10 11 12 # 在步骤3.5.5中只是移除了前端高速盘与bcacheX设备的关联关系, 但并未删除前端高速缓盘 # 还记得步骤3.3.2中的make-bcache -C吗? # 感觉-C的注册信息是被放在了/sys/fs/bcache/下, bf560b4a-2217-43d5-9ccb-aaccfba6c1b8为高速缓存盘的cset.uuid [root@localhost opt]# ls /sys/fs/bcache/ bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 pendings_cleanup register register_quiet # 取消前端高速缓存盘的注册 [root@localhost opt]# echo 1 >/sys/fs/bcache/bf560b4a-2217-43d5-9ccb-aaccfba6c1b8/unregister # 此时/sys/fs/bcache/下就没有相关信息了 [root@localhost opt]# ls /sys/fs/bcache/ pendings_cleanup register register_quiet 3.6 相关问题 3.6.1 Already a bcache device on /dev/sdX, overwrite with –wipe-bcache 1 2 3 4 5 6 7 8 9 10 [root@localhost opt]# make-bcache -B /dev/sdc Already a bcache device on /dev/sdc, overwrite with --wipe-bcache # 这是因为之前这块盘已经make-bcache过了, 可能出现在反复试验的时间, 多次创建、删除 [root@localhost opt]# make-bcache -B /dev/sdc --wipe-bcache UUID: 3b3c8cd1-864b-4fdb-9283-a2e212d0d290 Set UUID: 92d8465a-0720-4b30-8f7d-988abdf3ee85 version: 1 block_size: 1 data_offset: 16 3.6.2 Can’t open dev /dev/sdX: Device or resource busy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # 这个错误出现在我试验过程中, 在重新创建前端高速缓存设备的时间 # 这是因为前端高速缓存设备已经创建过了, 并未删除导致的 # 可参考步骤3.5.6的方法进行删除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot [root@localhost opt]# make-bcache -C /dev/sdb Can't open dev /dev/sdb: Device or resource busy # 查看前端高速缓存设备注册信息? [root@localhost opt]# ls /sys/fs/bcache/ 0b241b68-c354-461d-9ca1-ea00448057a9 pendings_cleanup register register_quiet # 由于当前系统是干净的, 但是/sys/fs/bcache/目录下存在注册信息, 应该是忘记删除导致的 # 对该注册信息进行删除(取消注册) [root@localhost opt]# echo 1 >/sys/fs/bcache/0b241b68-c354-461d-9ca1-ea00448057a9/unregister [root@localhost opt]# ls /sys/fs/bcache/ pendings_cleanup register register_quiet # 重新创建前端高速缓存设备 [root@localhost opt]# make-bcache -C /dev/sdb --wipe-bcache UUID: ba550b3f-646b-4740-8192-b9b2bebc3d63 Set UUID: f8361f22-92c3-421e-8a21-e5a5c6997508 version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 [root@localhost opt]# ls /sys/fs/bcache/ f8361f22-92c3-421e-8a21-e5a5c6997508 pendings_cleanup register register_quiet 4. 调优参考 4.1 设置writeback提高写性能 1 2 3 # 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景 [root@localhost opt]# echo writeback > /sys/block/bcacheX/bcache/cache_mode 4.2 允许缓存顺序I/O 1 2 # 默认情况下, bcache不会缓存顺序IO和大文件, 所以顺序写性能应该没什么提升. 可以打开顺序IO缓存 [root@localhost opt]# echo 0 > /sys/block/bcacheX/bcache/sequential_cutoff 4.3 调整顺序IO阈值 1 2 3 4 5 # 调整backing设备的顺序IO阈值, 默认是4M, 也就是说如果bcache设备的连续IO达到4MB以上时是直接读写backing盘, 不会走SSD缓存盘, 如果要设置成8M, 则可如下 [root@localhost opt]# echo "8M" > /sys/block/bcacheX/bcache/sequential_cutoff # 实际测试时报错。。。 -bash: echo: write error: Invalid argument 4.4 关闭拥塞控制项 1 2 3 # 这种情况最可能发生在一块缓存磁盘作为多个普通盘的缓存磁盘, 写入或读取处理不过来时, 就会形成堵塞, 这时我们可以关闭拥塞控制项. 默认情况下, 当读请求超过2ms, 写请求超过20ms时就会直接读写backing盘 [root@localhost opt]# echo 0 > /sys/fs/bcache/{cache set uuid}/congested_read_threshold_us [root@localhost opt]# echo 0 > /sys/fs/bcache/{cache set uuid}/congested_write_threshold_us 5. 参考资料 【武汉LUG】 Bcache Linux块设备层加速缓存现状与发展 鲲鹏BoostKit: Bcache OpenSUSE: 用于块设备操作的多层超速缓存 Linux Kernel: A block layer cache (bcache) CentOS7 安装bcache加速 SSD加速SATA盘之bcache策略 LVM之Cache加速 bcache配置使用 bcache bcache/如何使用bcache构建LVM,软RAID/如何优化bcache bcache 状态/配置 文件详细介绍(翻译自官网) |
CopyRight 2018-2019 实验室设备网 版权所有 |